iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
AI Engineering

30 天打造高齡智慧健康照護 AI Companion系列 第 11

Day 11|記憶不是存了就不動:處理 Memory 更新、衝突與遺忘

  • 分享至 

  • xImage
  •  

前兩天已經完成第一版 Memory Pipeline。

Day 09 解決的是:

AI 要怎麼記住一件事情?

Day 10 解決的是:

AI 要怎麼在需要的時候想起它?

但做到這裡,又出現一個新的問題:

如果使用者改變了呢?

人的偏好、習慣和生活狀態都不是永遠固定的。

例如之前使用者說:

我晚上很喜歡出去散步。

Memory 裡可能存成:

{
  "type": "preference",
  "content": "晚上喜歡散步"
}

但過了一段時間,使用者又說:

最近晚上比較不想出去走了。

如果系統只是一直新增 Memory,就可能同時存在:

晚上喜歡散步
晚上不想出去散步

下一次 Retrieval 時,反而不知道哪一個才是現在的狀態。

所以今天要處理的是:

Memory Update、Conflict 與 Forgetting。

Memory 不能只會新增

第一版 Memory 最簡單的做法是:

Conversation
↓
Memory Extraction
↓
Insert Database

但真正的 Long-term Memory 不能只有 Insert。

新的資訊進來之後,還需要先和過去相關的 Memory 比較:

New Memory
↓
Retrieve Related Memory
↓
Compare
↓
Insert / Update / Merge / Replace

也就是在存進資料庫之前,多一層判斷。

新舊 Memory 衝突怎麼辦?

例如原本有:

晚上喜歡散步

新的對話卻是:

最近晚上比較不想出去走了

這時候不應該單純再新增第二筆 Memory。

因為兩句話描述的是同一個「散步偏好」,只是使用者現在的狀態改變了。

因此可以把原本的 Memory 更新成:

{
  "type": "preference",
  "content": "最近晚上較少散步",
  "updated_at": "..."
}

讓下一次 Retrieval 優先取得比較新的狀態。

Update、Merge、Replace

目前我先把 Memory 的更新分成幾種情況。

Update

同一件事情的狀態改變:

喜歡晚上散步
↓
最近比較少晚上散步

更新原本的 Memory。

Merge

新的資訊是在補充原本的資訊:

喜歡散步
+
通常晚餐後散步
↓
喜歡在晚餐後散步

把兩筆資訊整合成更完整的 Memory。

Replace

新的資訊明確取代原本的資訊:

最喜歡喝咖啡
↓
現在比較喜歡喝茶

這時舊資訊就不應該繼續被當成目前主要偏好。

時間也開始變得重要

做到 Memory Update 之後,Memory 不能只有:

type
content

還需要加入一些時間資訊,例如:

created_at
updated_at
last_accessed_at

因為「以前喜歡散步」和「最近喜歡散步」,即使 Semantic Search 看起來非常相似,代表的狀態其實不同。

因此之後 Retrieval 也不能只看:

Semantic Similarity

還可以進一步考慮:

Similarity
+
Recency
+
Importance

讓比較新、比較重要的 Memory 更容易被取回。

Memory 也需要遺忘

不是所有 Memory 都需要永久保留。

例如:

今天下午想喝珍珠奶茶

可能過幾天就沒有太大的價值。

但:

平常喜歡喝無糖茶

就比較像長期偏好。

因此 Memory 可以加入:

importance
last_accessed_at
expires_at

讓低重要性、具有時效性,而且長時間沒有被使用的 Memory,慢慢降低 Retrieval 的權重。

這裡的「遺忘」也不一定代表直接從資料庫 Delete。

第一版可以先做到:

讓已經不重要的 Memory 越來越不容易被 Retrieval 找回來。

General Memory 和 Health Memory 不太一樣

做到這裡,也發現 General Memory 和 Health Memory 不能完全使用相同的更新方式。

General Memory 比較常描述:

偏好
習慣
人物關係
生活資訊

這些資訊通常比較重視「現在的狀態」。

例如:

以前晚上喜歡散步
↓
最近不太散步

可以透過 Update 或 Replace 更新。

但 Health Memory 不太一樣。

例如:

Day 1:昨天睡不好

Day 3:今天睡得好多了

這兩筆資訊看起來不同,但其實沒有互相衝突。

因為它們描述的是:

不同時間點的健康狀態。

所以 Health Memory 不應該直接把:

睡不好

Replace 成:

睡得很好

而是保留下來:

Day 1 → 睡眠狀況差
Day 3 → 睡眠狀況改善

形成一條 Health Timeline。

這樣未來才有可能觀察:

睡眠
飲食
活動
身體不適
用藥
↓
不同時間點的 Health Memory
↓
長期狀態變化

第一版 Memory Update Pipeline

加入今天的處理之後,目前 Memory Pipeline 變成:

Conversation
↓
Memory Extraction
↓
Related Memory Retrieval
↓
Memory Comparison
↓
Insert / Update / Merge / Replace
↓
Memory Store
↓
New Conversation
↓
Memory Retrieval
↓
LLM Context

到這裡,Memory 不再只是把資訊一直存進資料庫,而是開始能根據新的對話,判斷要新增、更新、合併還是取代原本的記憶。

而 General Memory 與 Health Memory 也開始出現不同的方向:

General Memory
↓
維護目前狀態

Health Memory
↓
保留時間序列
↓
觀察狀態變化

下一步,就可以正式把 Health Memory 獨立出來,開始記錄使用者一段時間內的健康狀態變化。


上一篇
Day 10|記得還不夠:讓 AI 找回正確的 Memory
下一篇
Day 12|從聊天中看見健康變化:建立 Health Memory
系列文
30 天打造高齡智慧健康照護 AI Companion21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言